package com.smdp.utils;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * 通过Jwt，根据用户id和用户名生成token，以及根据token生成用户id和用户名。
 */
public class JwtHelper {

    /**
     * token过期时间
     */
    private static final long TOKEN_EXPIRATION = 24 * 60 * 60 * 1000;

    /**
     * JWT所用的签名信息
     */
    private static final String TOKEN_SIGN_KEY = "smdp";

    /**
     * 根据用户id和用户名生成token
     *
     * @param userId 用户id
     * @param userName 用户名
     * @return JWT生成的token
     */
    public static String createToken(Long userId, String userName) {
        String token = Jwts.builder()
                .setSubject("HMDP-USER")
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRATION))
                .claim("userId", userId)
                .claim("userName", userName)
                .signWith(SignatureAlgorithm.HS512, TOKEN_SIGN_KEY)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }

    /**
     * 根据token生成用户id
     * @param token token
     * @return 用户id
     */
    public static Long getUserId(String token) {
        if (StringUtils.isEmpty(token)) return null;
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(TOKEN_SIGN_KEY).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer) claims.get("userId");
        return userId.longValue();
    }

    /**
     * 根据token生成用户名
     * @param token token
     * @return 用户名
     */
    public static String getUserName(String token) {
        if (StringUtils.isEmpty(token)) return "";
        Jws<Claims> claimsJws
                = Jwts.parser().setSigningKey(TOKEN_SIGN_KEY).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return (String) claims.get("userName");
    }

}

